package fast.calc;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import fast.data.Spec;
import fast.data.Stat;

public class GearBuffs {

	private List<GearBuffData> gbd = new ArrayList<GearBuffData>();
	private List<String> sid = 
		Arrays.asList(	"t14_2pc","t14_4pc","t15_2pc","t15_4pc","t16_2pc","t16_4pc");
	
	private List<String> settings = 
		Arrays.asList(	"use_and_get_tott",
						"combat_use_rupture","combat_use_rupture_during_sync","sync_ar_with_sb","combat_pool_before_sb",
						"combat_waste_cp","combat_use_blade_flurry","assa_pool_before_sb");
	private List<String> gearBuffs = new ArrayList<String>();
	private HashMap<String,Integer> gearBuffItemLevel = new HashMap<String,Integer>();
	private Set<String> setItems = new HashSet<String>();
	
	public GearBuffs() {
	
		// 5.2
		// Capacitive Primal Diamond
		// [280 + 75% AP] Nature damage
		// - Assassination: 1.535
		// - Combat: 0.99
		// - Subtlety: 0.98
		GearBuffData cpd = new GearBuffData();
		cpd.name = "capacitive_primal_diamond";
		cpd.type = "direct_damage";
		cpd.procs_of = "both";
		cpd.rppm = 19.27;
		cpd.stacks = 5;
		gbd.add(cpd);
		
		GearBuffData tof = new GearBuffData();
		tof.name = "talisman_of_bloodlust";
		tof.type = "buff";
		tof.procs_of = "both";
		tof.rppm = 3.5;
		tof.duration = 10;
		tof.stacks = 5;
		tof.scaling = true;
		tof.base_lvl = 522;
		tof.proc = new Procs();
		tof.proc.setStat(Stat.hst, 0.5189999938);
		gbd.add(tof);
		
		GearBuffData toft = new GearBuffData();
		toft.name = "talisman_of_bloodlust_thunder";
		toft.type = "buff";
		toft.procs_of = "both";
		toft.rppm = 3.5;
		toft.duration = 10;
		toft.stacks = 5;
		toft.scaling = true;
		toft.base_lvl = 528;
		toft.proc = new Procs();
		toft.proc.setStat(Stat.hst, 0.5189999938);
		gbd.add(toft);
		
		GearBuffData toflfr = new GearBuffData();
		toflfr.name = "talisman_of_bloodlust_lfr";
		toflfr.type = "buff";
		toflfr.procs_of = "both";
		toflfr.rppm = 3.5;
		toflfr.duration = 10;
		toflfr.stacks = 5;
		toflfr.scaling = true;
		toflfr.base_lvl = 502;
		toflfr.proc = new Procs();
		toflfr.proc.setStat(Stat.hst, 0.5189999938);
		gbd.add(toflfr);
		
		GearBuffData tofhc = new GearBuffData();
		tofhc.name = "talisman_of_bloodlust_heroic";
		tofhc.type = "buff";
		tofhc.procs_of = "both";
		tofhc.rppm = 3.5;
		tofhc.duration = 10;
		tofhc.stacks = 5;
		tofhc.scaling = true;
		tofhc.base_lvl = 535;
		tofhc.proc = new Procs();
		tofhc.proc.setStat(Stat.hst, 0.5189999938);
		gbd.add(tofhc);
		
		GearBuffData tofhct = new GearBuffData();
		tofhct.name = "talisman_of_bloodlust_heroic_thunder";
		tofhct.type = "buff";
		tofhct.procs_of = "both";
		tofhct.rppm = 3.5;
		tofhct.duration = 10;
		tofhct.stacks = 5;
		tofhct.scaling = true;
		tofhct.base_lvl = 541;
		tofhct.proc = new Procs();
		tofhct.proc.setStat(Stat.hst, 0.5189999938);
		gbd.add(tofhct);
		
		GearBuffData rsc = new GearBuffData();
		rsc.name = "renatakis_soul_charm";
		rsc.type = "buff";
		rsc.procs_of = "both";
		rsc.rppm = 0.616;
		rsc.icd = 22;
		rsc.duration = 20;
		rsc.scaling = true;
		rsc.base_lvl = 522;
		rsc.proc = new Procs();
		rsc.proc.setStat(Stat.agi, avg_renatakis_soul_charm(0.4499999881)); // 1333
		gbd.add(rsc);
		
		GearBuffData rsct = new GearBuffData();
		rsct.name = "renatakis_soul_charm_thunder";
		rsct.type = "buff";
		rsct.procs_of = "both";
		rsct.rppm = 0.616;
		rsct.icd = 22;
		rsct.duration = 20;
		rsct.scaling = true;
		rsct.base_lvl = 528;
		rsct.proc = new Procs();
		rsct.proc.setStat(Stat.agi, avg_renatakis_soul_charm(0.4499999881)); // 1410
		gbd.add(rsct);
		
		GearBuffData rsclfr = new GearBuffData();
		rsclfr.name = "renatakis_soul_charm_lfr";
		rsclfr.type = "buff";
		rsclfr.procs_of = "both";
		rsclfr.rppm = 0.616;
		rsclfr.icd = 22;
		rsclfr.duration = 20;
		rsclfr.scaling = true;
		rsclfr.base_lvl = 502;
		rsclfr.proc = new Procs();
		rsclfr.proc.setStat(Stat.agi, avg_renatakis_soul_charm(0.4499999881)); /// 1107
		gbd.add(rsclfr);
		
		GearBuffData rschc = new GearBuffData();
		rschc.name = "renatakis_soul_charm_heroic";
		rschc.type = "buff";
		rschc.procs_of = "both";
		rschc.rppm = 0.616;
		rschc.icd = 22;
		rschc.duration = 20;
		rschc.scaling = true;
		rschc.base_lvl = 535;
		rschc.proc = new Procs();
		rschc.proc.setStat(Stat.agi, avg_renatakis_soul_charm(0.4499999881)); // 1505
		gbd.add(rschc);
		
		GearBuffData rschct = new GearBuffData();
		rschct.name = "renatakis_soul_charm_heroic_thunder";
		rschct.type = "buff";
		rschct.procs_of = "both";
		rschct.rppm = 0.616;
		rschct.icd = 22;
		rschct.duration = 20;
		rschct.scaling = true;
		rschct.haste_scaling = false;
		rschct.base_lvl = 541;
		rschct.proc = new Procs();
		rschct.proc.setStat(Stat.agi, avg_renatakis_soul_charm(0.4499999881)); // 1592
		gbd.add(rschct);
		
		GearBuffData spt = new GearBuffData();
		spt.name = "shadopan_talisman";
		spt.type = "buff";
		spt.procs_of = "both";
		spt.proc_chance = 0.15;
		spt.icd = 105;
		spt.duration = 20;
		spt.scaling = true;
		spt.base_lvl = 522;
		spt.proc = new Procs();
		spt.proc.setStat(Stat.agi, 2.9700000286);
		gbd.add(spt);
		
		GearBuffData roro = new GearBuffData();
		roro.name = "rune_of_reorigination";
		roro.type = "buff";
		roro.procs_of = "both";
		roro.duration = 10;
		roro.icd = 22;
		roro.rppm = getRuneOfReoriginationRPPM(522);
		gbd.add(roro);
		
		GearBuffData rorot = new GearBuffData();
		rorot.name = "rune_of_reorigination_thunder";
		rorot.type = "buff";
		rorot.procs_of = "both";
		rorot.duration = 10;
		rorot.icd = 22;
		rorot.rppm = getRuneOfReoriginationRPPM(528);
		gbd.add(rorot);
		
		GearBuffData rorolfr = new GearBuffData();
		rorolfr.name = "rune_of_reorigination_lfr";
		rorolfr.type = "buff";
		rorolfr.procs_of = "both";
		rorolfr.duration = 10;
		rorolfr.icd = 22;
		rorolfr.rppm = getRuneOfReoriginationRPPM(502);
		gbd.add(rorolfr);
		
		GearBuffData rorohc = new GearBuffData();
		rorohc.name = "rune_of_reorigination_heroic";
		rorohc.type = "buff";
		rorohc.procs_of = "both";
		rorohc.duration = 10;
		rorohc.icd = 22;
		rorohc.rppm = getRuneOfReoriginationRPPM(535);
		gbd.add(rorohc);
		
		GearBuffData rorohct = new GearBuffData();
		rorohct.name = "rune_of_reorigination_heroic_thunder";
		rorohct.type = "buff";
		rorohct.procs_of = "both";
		rorohct.duration = 10;
		rorohct.icd = 22;
		rorohct.rppm = getRuneOfReoriginationRPPM(541);
		gbd.add(rorohct);
		
		GearBuffData bj = new GearBuffData();
		bj.name = "bad_juju";
		bj.type = "buff";
		bj.procs_of = "both";
		bj.duration = 20;
		bj.rppm = 0.55;
		bj.scaling = true;
		bj.base_lvl = 522;
		bj.proc = new Procs();
		bj.proc.setStat(Stat.agi, 2.4749999046); // 7333
		gbd.add(bj);
		
		GearBuffData bjt = new GearBuffData();
		bjt.name = "bad_juju_thunder";
		bjt.type = "buff";
		bjt.procs_of = "both";
		bjt.duration = 20;
		bjt.rppm = 0.55;
		bjt.scaling = true;
		bjt.base_lvl = 528;
		bjt.proc = new Procs();
		bjt.proc.setStat(Stat.agi, 2.4749999046); // 7757
		gbd.add(bjt);
		
		GearBuffData bjlfr = new GearBuffData();
		bjlfr.name = "bad_juju_lfr";
		bjlfr.type = "buff";
		bjlfr.procs_of = "both";
		bjlfr.duration = 20;
		bjlfr.rppm = 0.55;
		bjlfr.scaling = true;
		bjlfr.base_lvl = 502;
		bjlfr.proc = new Procs();
		bjlfr.proc.setStat(Stat.agi, 2.4749999046); // 6088
		gbd.add(bjlfr);
		
		GearBuffData bjhc = new GearBuffData();
		bjhc.name = "bad_juju_heroic";
		bjhc.type = "buff";
		bjhc.procs_of = "both";
		bjhc.duration = 20;
		bjhc.rppm = 0.55;
		bjhc.scaling = true;
		bjhc.base_lvl = 535;
		bjhc.proc = new Procs();
		bjhc.proc.setStat(Stat.agi, 2.4749999046); // 8279
		gbd.add(bjhc);
		
		GearBuffData bjhct = new GearBuffData();
		bjhct.name = "bad_juju_heroic_thunder";
		bjhct.type = "buff";
		bjhct.procs_of = "both";
		bjhct.duration = 20;
		bjhct.rppm = 0.55;
		bjhct.scaling = true;
		bjhct.base_lvl = 541;
		bjhct.proc = new Procs();
		bjhct.proc.setStat(Stat.agi, 2.4749999046); // 8754
		gbd.add(bjhct);
		
		// Data
		GearBuffData mhwsrppm = new GearBuffData();
		mhwsrppm.name = "mh_windsong";
		mhwsrppm.type = "buff";
		mhwsrppm.procs_of = "both";
		mhwsrppm.duration = 12;
		mhwsrppm.rppm = 2;
		mhwsrppm.proc = new Procs();
		mhwsrppm.proc.setStat(Stat.hst, 500);
		mhwsrppm.proc.setStat(Stat.cri, 500);
		mhwsrppm.proc.setStat(Stat.mst, 500);
		gbd.add(mhwsrppm);
		
		GearBuffData ohwsrppm = new GearBuffData();
		ohwsrppm.name = "oh_windsong";
		ohwsrppm.type = "buff";
		ohwsrppm.procs_of = "both";
		ohwsrppm.duration = 12;
		ohwsrppm.rppm = 2;
		ohwsrppm.proc = new Procs();
		ohwsrppm.proc.setStat(Stat.hst, 500);
		ohwsrppm.proc.setStat(Stat.cri, 500);
		ohwsrppm.proc.setStat(Stat.mst, 500);
		gbd.add(ohwsrppm);
		
		GearBuffData mhds = new GearBuffData();
		mhds.name = "mh_dancing_steel";
		mhds.type = "buff";
		mhds.procs_of = "both";
		mhds.duration = 12;
		mhds.rppm = 2;
		mhds.proc = new Procs();
		mhds.proc.setStat(Stat.agi, 1650);
		gbd.add(mhds);
		
		GearBuffData ohds = new GearBuffData();
		ohds.name = "oh_dancing_steel";
		ohds.type = "buff";
		ohds.procs_of = "both";
		ohds.duration = 12;
		ohds.rppm = 2;
		ohds.proc = new Procs();
		ohds.proc.setStat(Stat.agi, 1650);
		gbd.add(ohds);
		
		GearBuffData mhefrppm = new GearBuffData();
		mhefrppm.name = "mh_elemental_force";
		mhefrppm.type = "direct_damage";
		mhefrppm.rppm = 10;
		gbd.add(mhefrppm);
		
		GearBuffData ohefrppm = new GearBuffData();
		ohefrppm.name = "oh_elemental_force";
		ohefrppm.type = "direct_damage";
		ohefrppm.rppm = 10;
		gbd.add(ohefrppm);
	
		GearBuffData mhl = new GearBuffData();
		mhl.name = "mh_landslide";
		mhl.type = "buff";
		mhl.procs_of = "mh";
		mhl.duration = 12;
		mhl.ppm = 1;
		mhl.proc = new Procs();
		mhl.proc.setStat(Stat.ap, 1000);
		gbd.add(mhl);
		
		GearBuffData ohl = new GearBuffData();
		ohl.name = "oh_landslide";
		ohl.type = "buff";
		ohl.procs_of = "oh";
		ohl.duration = 12;
		ohl.ppm = 1;
		ohl.proc = new Procs();
		ohl.proc.setStat(Stat.ap, 1000);
		gbd.add(ohl);
		
//		GearBuffData mhh = new GearBuffData();
//		mhh.name = "mh_hurricane";
//		mhh.type = "buff";
//		mhh.procs_of = "mh";
//		mhh.duration = 12;
//		mhh.ppm = 1;
//		mhh.proc = new Procs();
//		mhh.proc.haste = 450;
//		gbd.add(mhh);
//		
//		GearBuffData ohh = new GearBuffData();
//		ohh.name = "oh_hurricane";
//		ohh.type = "buff";
//		ohh.procs_of = "oh";
//		ohh.duration = 12;
//		ohh.ppm = 1;
//		ohh.proc = new Procs();
//		ohh.proc.haste = 450;
//		gbd.add(ohh);
		
		GearBuffData nk = new GearBuffData();
		nk.name = "no_kaled";
		nk.type = "direct_damage";
		nk.icd = 2;
		nk.procs_of = "mh";
		nk.proc_chance = 0.065;
		gbd.add(nk);
		
		GearBuffData nkh = new GearBuffData();
		nkh.name = "no_kaled_heroic";
		nkh.type = "direct_damage";
		nkh.icd = 2;
		nkh.procs_of = "mh";
		nkh.proc_chance = 0.065;
		gbd.add(nkh);
		
		GearBuffData vos = new GearBuffData();
		vos.name = "vial_of_shadows";
		vos.type = "direct_damage";
		vos.icd = 9;
		vos.procs_of = "both";
		vos.proc_chance = 0.45;
		gbd.add(vos);
		
		GearBuffData vosh = new GearBuffData();
		vosh.name = "vial_of_shadows_heroic";
		vosh.type = "direct_damage";
		vosh.icd = 9;
		vosh.procs_of = "both";
		vosh.proc_chance = 0.45;
		gbd.add(vosh);
		
		GearBuffData voslfr = new GearBuffData();
		voslfr.name = "vial_of_shadows_lfr";
		voslfr.type = "direct_damage";
		voslfr.icd = 9;
		voslfr.procs_of = "both";
		voslfr.proc_chance = 0.45;
		gbd.add(voslfr);
		
		GearBuffData thh = new GearBuffData();
		thh.name = "the_hungerer_heroic";
		thh.type = "buff";
		thh.icd = 45;
		thh.duration = 15;
		thh.procs_of = "both";
		thh.proc = new Procs();
		thh.proc.setStat(Stat.hst, 1730);
		gbd.add(thh);
		
		GearBuffData sclfr = new GearBuffData();
		sclfr.name = "starcatcher_compass_lfr";
		sclfr.type = "buff";
		sclfr.icd = 115;
		sclfr.duration = 20;
		sclfr.procs_of = "both";
		sclfr.proc_chance = 0.15;
		sclfr.proc = new Procs();
		sclfr.proc.setStat(Stat.hst, 2573);
		gbd.add(sclfr);
		
		GearBuffData sc = new GearBuffData();
		sc.name = "starcatcher_compass";
		sc.type = "buff";
		sc.icd = 115;
		sc.duration = 20;
		sc.procs_of = "both";
		sc.proc_chance = 0.15;
		sc.proc = new Procs();
		sc.proc.setStat(Stat.hst, 2904);
		gbd.add(sc);
		
		GearBuffData sch = new GearBuffData();
		sch.name = "starcatcher_compass_heroic";
		sch.type = "buff";
		sch.icd = 115;
		sch.duration = 20;
		sch.procs_of = "both";
		sch.proc_chance = 0.15;
		sch.proc = new Procs();
		sch.proc.setStat(Stat.hst, 3278);
		gbd.add(sch);
		
		GearBuffData wou = new GearBuffData();
		wou.name = "wrath_of_unchaining";
		wou.type = "buff";
		wou.duration = 10;
		wou.stacks = 10;
		wou.procs_of = "both";
		wou.proc = new Procs();
		wou.proc.setStat(Stat.agi, 88);
		gbd.add(wou);
		
		GearBuffData wouh = new GearBuffData();
		wouh.name = "wrath_of_unchaining_heroic";
		wouh.type = "buff";
		wouh.duration = 10;
		wouh.stacks = 10;
		wouh.procs_of = "both";
		wouh.proc = new Procs();
		wouh.proc.setStat(Stat.agi, 99);
		gbd.add(wouh);
		
		GearBuffData woulfr = new GearBuffData();
		woulfr.name = "wrath_of_unchaining_lfr";
		woulfr.type = "buff";
		woulfr.duration = 10;
		woulfr.stacks = 10;
		woulfr.procs_of = "both";
		woulfr.proc = new Procs();
		woulfr.proc.setStat(Stat.agi, 78);
		gbd.add(woulfr);
		
		GearBuffData mr = new GearBuffData();
		mr.name = "matrix_restabilizer";
		mr.type = "buff";
		mr.icd = 105;
		mr.duration = 30;
		mr.procs_of = "both";
		mr.proc_chance = 0.1;
		mr.proc = new Procs();
		mr.proc.setStat(Stat.hst, 1624);
		gbd.add(mr);
		
		GearBuffData mrh = new GearBuffData();
		mrh.name = "matrix_restabilizer_heroic";
		mrh.type = "buff";
		mrh.icd = 105;
		mrh.duration = 30;
		mrh.procs_of = "both";
		mrh.proc_chance = 0.1;
		mrh.proc = new Procs();
		mrh.proc.setStat(Stat.hst, 1834);
		gbd.add(mrh);
		
		GearBuffData ks = new GearBuffData();
		ks.name = "kiroptyric_sigil";
		ks.type = "buff";
		ks.icd = 90;
		ks.duration = 15;
		ks.procs_of = "both";
		ks.proc = new Procs();
		ks.proc.setStat(Stat.agi, 2290);
		gbd.add(ks);
		
		//Cataclysmic Gladiator's Insignia of Conquest
		GearBuffData cgioc = new GearBuffData();
		cgioc.name = "insignia_of_conquest";
		cgioc.type = "buff";
		cgioc.icd = 55;
		cgioc.duration = 20;
		cgioc.procs_of = "both";
		cgioc.proc_chance = 0.15;
		cgioc.proc = new Procs();
		cgioc.proc.setStat(Stat.agi, 1452);
		gbd.add(cgioc);
		
		GearBuffData ht = new GearBuffData();
		ht.name = "hawkmasters_talon";
		ht.type = "buff";
		ht.icd = 60;
		ht.duration = 15;
		ht.procs_of = "both";
		ht.scaling = true;
		ht.base_lvl = 489;
		ht.proc = new Procs();
		ht.proc.setStat(Stat.hst, 1.6499999762);
		gbd.add(ht);
		
		GearBuffData jbf = new GearBuffData();
		jbf.name = "jade_bandit_figurine";
		jbf.type = "buff";
		jbf.icd = 60;
		jbf.duration = 15;
		jbf.procs_of = "both";
		jbf.scaling = true;
		jbf.base_lvl = 489;
		jbf.proc = new Procs();
		jbf.proc.setStat(Stat.hst, 1.6499999762);
		gbd.add(jbf);
		
		GearBuffData gpa = new GearBuffData();
		gpa.name = "gerps_perfect_arrow";
		gpa.type = "buff";
		gpa.icd = 120;
		gpa.duration = 20;
		gpa.procs_of = "both";
		gpa.proc = new Procs();
		gpa.proc.setStat(Stat.agi, 3480);
		gbd.add(gpa);
		
		GearBuffData wph = new GearBuffData();
		wph.name = "windswept_pages";
		wph.type = "buff";
		wph.icd = 65;
		wph.duration = 20;
		wph.procs_of = "both";
		wph.proc_chance = 0.15;
		wph.scaling = true;
		wph.blue = true;
		wph.base_lvl = 463;
		wph.proc = new Procs();
		wph.proc.setStat(Stat.hst, 1.9800000191);
		gbd.add(wph);
		
		GearBuffData titm = new GearBuffData();
		titm.name = "terror_in_the_mists";
		titm.type = "buff";
		titm.icd = 105;
		titm.duration = 20;
		titm.procs_of = "both";
		titm.proc_chance = 0.15;
		titm.scaling = true;
		titm.base_lvl = 496;
		titm.proc = new Procs();
		titm.proc.setStat(Stat.cri, 2.9700000286);
		gbd.add(titm);
		
		GearBuffData titmh = new GearBuffData();
		titmh.name = "terror_in_the_mists_heroic";
		titmh.type = "buff";
		titmh.icd = 105;
		titmh.duration = 20;
		titmh.procs_of = "both";
		titmh.proc_chance = 0.15;
		titmh.scaling = true;
		titmh.base_lvl = 509;
		titmh.proc = new Procs();
		titmh.proc.setStat(Stat.cri, 2.9700000286);
		gbd.add(titmh);
		
		GearBuffData titmlfr = new GearBuffData();
		titmlfr.name = "terror_in_the_mists_lfr";
		titmlfr.type = "buff";
		titmlfr.icd = 105;
		titmlfr.duration = 20;
		titmlfr.procs_of = "both";
		titmlfr.proc_chance = 0.15;
		titmlfr.scaling = true;
		titmlfr.base_lvl = 483;
		titmlfr.proc = new Procs();
		titmlfr.proc.setStat(Stat.cri, 2.9700000286);
		gbd.add(titmlfr);
		
		GearBuffData bois = new GearBuffData();
		bois.name = "bottle_of_infinite_stars";
		bois.type = "buff";
		bois.icd = 45;
		bois.duration = 20;
		bois.procs_of = "both";
		bois.proc_chance = 0.15;
		bois.scaling = true;
		bois.base_lvl = 489;
		bois.proc = new Procs();
		bois.proc.setStat(Stat.agi, 1.4850000143);
		gbd.add(bois);
		
		GearBuffData boish = new GearBuffData();
		boish.name = "bottle_of_infinite_stars_heroic";
		boish.type = "buff";
		boish.icd = 45;
		boish.duration = 20;
		boish.procs_of = "both";
		boish.proc_chance = 0.15;
		boish.scaling = true;
		boish.base_lvl = 502;
		boish.proc = new Procs();
		boish.proc.setStat(Stat.agi, 1.4850000143);
		gbd.add(boish);
		
		GearBuffData boislfr = new GearBuffData();
		boislfr.name = "bottle_of_infinite_stars_lfr";
		boislfr.type = "buff";
		boislfr.icd = 45;
		boislfr.duration = 20;
		boislfr.procs_of = "both";
		boislfr.proc_chance = 0.15;
		boislfr.scaling = true;
		boislfr.base_lvl = 476;
		boislfr.proc = new Procs();
		boislfr.proc.setStat(Stat.agi, 1.4850000143);
		gbd.add(boislfr);
		
		GearBuffData fst = new GearBuffData();
		fst.name = "flashing_steel_talisman";
		fst.type = "buff";
		fst.icd = 90;
		fst.duration = 15;
		fst.procs_of = "both";
		fst.scaling = true;
		fst.blue = true;
		fst.base_lvl = 463;
		fst.proc = new Procs();
		fst.proc.setStat(Stat.agi, 2.4749999046);
		gbd.add(fst);
		
		GearBuffData rox = new GearBuffData();
		rox.name = "relic_of_xuen";
		rox.type = "buff";
		rox.icd = 55;
		rox.duration = 15;
		rox.procs_of = "both";
		rox.onlyCrit = true;
		rox.proc_chance = 0.2;
		rox.scaling = true;
		rox.base_lvl = 476;
		rox.proc = new Procs();
		rox.proc.setStat(Stat.agi, 1.5684000254);
		gbd.add(rox);
		
		// woundripper_medallion 1.6499999762
		GearBuffData wrm = new GearBuffData();
		wrm.name = "woundripper_medallion";
		wrm.type = "buff";
		wrm.icd = 60;
		wrm.duration = 15;
		wrm.procs_of = "both";
		wrm.scaling = true;
		wrm.base_lvl = 496;
		wrm.proc = new Procs();
		wrm.proc.setStat(Stat.cri, 1.6499999762);
		gbd.add(wrm);
		
		GearBuffData sw = new GearBuffData();
		sw.name = "searing_words";
		sw.type = "buff";
		sw.icd = 85;
		sw.duration = 25;
		sw.procs_of = "both";
		sw.onlyCrit = true;
		sw.proc_chance = 0.45;
		sw.scaling = true;
		sw.blue = true;
		sw.base_lvl = 463;
		sw.proc = new Procs();
		sw.proc.setStat(Stat.agi, 1.9800000191);
		gbd.add(sw);
		
		GearBuffData bots = new GearBuffData();
		bots.name = "braid_of_ten_songs";
		bots.type = "buff";
		bots.icd = 50;
		bots.duration = 20;
		bots.procs_of = "both";
		bots.proc_chance = 0.2;
		bots.proc = new Procs();
		bots.proc.setStat(Stat.hst, 1851); 
		gbd.add(bots);
		
		GearBuffData cccc = new GearBuffData();
		cccc.name = "corens_cold_chromium_coaster";
		cccc.type = "buff";
		cccc.icd = 45;
		cccc.duration = 10;
		cccc.procs_of = "both";
		cccc.onlyCrit = true;
		cccc.proc_chance = 0.1;
		cccc.scaling = true;
		cccc.base_lvl = 470;
		cccc.proc = new Procs();
		cccc.proc.setStat(Stat.ap, 5.9439997673);
		gbd.add(cccc);
		
		// only eng
		GearBuffData engss = new GearBuffData();
		engss.name = "synapse_springs";
		engss.type = "buff";
		engss.icd = 60;
		engss.duration = 10;
		engss.procs_of = "both";
		engss.proc = new Procs();
		engss.proc.setStat(Stat.agi, 1920);
		gbd.add(engss);
		
		GearBuffData tailorse = new GearBuffData();
		tailorse.name = "swordguard_embroidery";
		tailorse.type = "buff";
		tailorse.icd = 55;
		tailorse.duration = 15;
		tailorse.procs_of = "both";
		tailorse.proc_chance = 0.15;
		tailorse.proc = new Procs();
		tailorse.proc.setStat(Stat.ap, 4000);
		gbd.add(tailorse);
		
		GearBuffData herblifeblood = new GearBuffData();
		herblifeblood.name = "lifeblood";
		herblifeblood.type = "buff";
		herblifeblood.icd = 120;
		herblifeblood.duration = 20;
		herblifeblood.procs_of = "both";
		herblifeblood.proc = new Procs();
		herblifeblood.proc.setStat(Stat.hst, 2880);
		gbd.add(herblifeblood);
		
		GearBuffData totg = new GearBuffData();
		totg.name = "touch_of_the_grave";
		totg.type = "direct_damage";
		totg.icd = 15;
		totg.procs_of = "both";
		totg.proc_chance = 0.2;
		gbd.add(totg);
		
		GearBuffData zenalchemiststone = new GearBuffData();
		zenalchemiststone.name = "zen_alchemist_stone"; // item id = 75274
		zenalchemiststone.type = "buff";
		zenalchemiststone.icd = 55;
		zenalchemiststone.duration = 15;
		zenalchemiststone.procs_of = "both";
		zenalchemiststone.proc_chance = 0.25;
		zenalchemiststone.scaling = true;
		zenalchemiststone.blue = true;
		zenalchemiststone.base_lvl = 458;
		zenalchemiststone.proc = new Procs();
		zenalchemiststone.proc.setStat(Stat.agi, 2.6670000553);
		gbd.add(zenalchemiststone);
	}
	
	public GearBuffData getGearBuffData(String name){
		for(GearBuffData g: gbd){
			if(g.name.equals(name))
				return g;
		}
		return null;
	}
	
	public void setSetItems(Set<String> set) {
		setItems = set;
	}
	
	public void setGearBuffs(List<String> gbs){
		gearBuffs = gbs;
	}
	
	public List<String> getGearBuffs(){
		return gearBuffs;
	}
	
	public List<GearBuffData> getAll(){
		return gbd;
	}
	
	public List<String> getAllSets(){
		return sid;
	}
	
	public boolean has(String name){
		return gearBuffs.contains(name);
	}
	
	public boolean hasSet(String name){
		return setItems.contains(name);
	}

	public Set<String> getSetItems() {
		return setItems;
	}
	
	public List<String> getAllSettings() {
		return settings;
	}

	public void setGearBuffItemLevel(HashMap<String, Integer> gearBuffItemLevel) {
		this.gearBuffItemLevel = gearBuffItemLevel;
	}
	
	public HashMap<String, Integer> getGearBuffItemLevel(){
		return this.gearBuffItemLevel;
	}
	
	private double avg_renatakis_soul_charm(double base_agi){
		double sum = 0.0;
		for(int i = 1; i <= 10; i++){
			sum += base_agi * i;
		}
		return sum / 10.;
	}
	
	private double getRuneOfReoriginationRPPM(double item_level){
		double rate = 1./(Math.pow(1.15,((528-item_level)/15)));
		return rate * 1.1;
	}
	
	public double getCapacitivePrimalDiamondRPPM(Spec spec){
		double rppm = 19.27;
		if(spec == Spec.Assassination)
			rppm *= 1.789;
		else if(spec == Spec.Combat)
			rppm *= 1.136;
		else if(spec == Spec.Subtlety)
			rppm *= 1.114;
		return rppm;
	}
}
